#ifndef FPLAYER_EVENT_H
#define FPLAYER_EVENT_H

#include <mutex>
#include "CommonDefine.h"

using UniqueLock = std::unique_lock<std::mutex>;

/**
 * author: x-fan
 * date: 2024/1/9
 * desc: 封装互斥量、条件变量
 */
class Event {
private:
  //持有该互斥量的所有权的线程ID
  int32_t _LockID = INVALID_ID;

  //互斥量
  std::mutex _Mutex;

  //同步锁
  std::condition_variable _Cond;

public:
  Event() = default;

  virtual ~Event() = default;

  /**
   * @return 返回互斥量
   */
  std::mutex &getMutex();

  /**
   * 互斥量上锁
   * @param lock 互斥量RAII模板类
   * @return true is Success
   */
  bool lock(UniqueLock &lock);

  /**
   * 互斥量解锁
   * @param lock 互斥量RAII模板类
   */
  void unlock(UniqueLock &lock);

  /**
   * 线程进入等待状态，直到其它线程将其唤醒
   * @param timeMs 等待时长
   */
  void wait(UniqueLock &lock, TIME_MS timeMs = TIME_MS(0));

  /**
   * 唤醒等待线程，如果当前没有等待线程，则该函数什么也不做
   * @param notifyAll
   *    true:唤醒所有等待线程，去"抢"权限
   *    false:唤醒某个等待(wait)线程
   */
  void notify(bool notifyAll = true);
};


#endif //FPLAYER_EVENT_H
